package yc.star.forum.repository;


import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.ChatMessageDeserializer;
import dev.langchain4j.data.message.ChatMessageSerializer;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import java.time.Duration;
import java.util.Collections;
import java.util.List;

/**
 * Redis聊天记忆存储实现类
 * 实现了langchain4j的ChatMemoryStore接口，用于在Redis中存储和管理AI聊天的历史记录
 * 支持聊天消息的存储、检索和删除功能
 */
@Repository
public class RedisChatMemoryStore implements ChatMemoryStore {

    /**
     * Redis操作模板，用于执行Redis数据库操作
     */
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 根据会话ID获取聊天消息列表
     * @param memoryId 会话ID，用于标识不同的聊天会话
     * @return 聊天消息列表
     */
    @Override
    public List<ChatMessage> getMessages(Object memoryId) {
        // 从Redis中获取序列化的消息字符串
        Object messagesObj = redisTemplate.opsForValue().get(memoryId);
        // 检查Redis中是否存在该会话的数据，如果不存在则返回空列表
        if (messagesObj == null) {
            return Collections.emptyList();
        }
        String messages = messagesObj.toString();
        // 将JSON字符串反序列化为ChatMessage对象列表
        List<ChatMessage> chatMessages = ChatMessageDeserializer.messagesFromJson(messages);
        return chatMessages;
    }

    /**
     * 更新指定会话的聊天消息列表
     * @param memoryId 会话ID
     * @param list 要更新的聊天消息列表
     */
    @Override
    public void updateMessages(Object memoryId, List<ChatMessage> list) {
        // 将聊天消息列表序列化为JSON字符串
        String messages = ChatMessageSerializer.messagesToJson(list);
        // 存储到Redis中，设置过期时间为1天
        redisTemplate.opsForValue().set(memoryId.toString(), messages, Duration.ofDays(1));
    }

    /**
     * 删除指定会话的所有聊天消息
     * @param memoryId 会话ID
     */
    @Override
    public void deleteMessages(Object memoryId) {
        // 从Redis中删除指定会话的聊天记录
        redisTemplate.delete(memoryId.toString());
    }
}
